Skip to content

fix(types)!: retire ToastSchema.action from both published faces (objectui#8338) - #8540

Merged
os-sales merged 5 commits into
mainfrom
claude/issue-8338-retire-toast-action
Sep 8, 2026
Merged

fix(types)!: retire ToastSchema.action from both published faces (objectui#8338)#8540
os-sales merged 5 commits into
mainfrom
claude/issue-8338-retire-toast-action

Conversation

@claude

@claude claude Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Fixes #8338

Retires ToastSchema.action from BOTH published faces under ADR-0049 enforce-or-remove, the direction ruled at comment 5571798211. action?: never on the declaration, retirementTombstone() on the mirror.

The spine: it sits four lines above a tombstone that gives its own reason

ToastSchema.onDismiss has been an ADR-0049 tombstone since objectui#6124, and its prose reads "JSON has no function value, and the toast renderer takes ({ schema }) and never reads it." Every clause of that sentence is true of action as well. It survived only because that sweep was over TOP-LEVEL function-valued keys and this key's function is one level down — inside a required object, which is strictly worse: not "a function key is inert", but no JSON value satisfies the whole member.

The two faces shared nothing. The declaration required label and onClick; the mirror admitted SchemaNode | SchemaNode[]. One document, a green safeParse and a tsc refusal, and no spelling that satisfied both. The renderer read neither (it reads variant, title, description, duration, buttonVariant, className, buttonLabel; the file has exactly one ComponentRegistry.register call, so the zero is a reading and not a failed scan).

The parity-operator question triage ordered an answer to

Answered at comment 5572120924, and re-derived here on 3bc187b7f rather than quoted forward. The card offered two readings — the operator judged action clean, or it excused the key into the SCHEMA-NODE bucket. Neither. A third mechanism: with the mirror's input face reading unknown (the objectui#7760 defect), the wider-direction comparison could not form a reading at all, so no row existed to be right or wrong about. PR #8354 gave the recursive mirrors their declaration as a type argument, and on today's tree the key is ENTERED in KnownDrift, in WiderThanDeclared, and in WIDER_ARMS.

So the card body's section "The parity ledgers do not record it" is historical and is not quoted forward. What the retirement owed was ordinary ledger work: drain those rows and move the header's pinned figures.

The header figures, derived and not stepped by hand

Read by zod-mirror-parity.test.ts's own AST and mirror instruments — the ledger rows were removed first, the pins were run, and the numbers below are the ones those pins printed:

ledger before after
KnownDrift 42 entries / 64 keys 41 / 63
KnownDrift restatement (~120 lines down) 42 41
WiderThanDeclared 23 entries / 36 keys / 47 arms 22 / 35 / 45
arm split (SCHEMA-NODE / CONCRETE / MIXED / unions) 6 / 30 / 0 / 11 6 / 29 / 0 / 10
EXPECTED_MIRROR_PAIRS 158 158 (the pair stays registered)

CONCRETE fell by 1 while arms fell by 2 — the split counts KEYS and the arm total counts ARMS, through different reducers. A hand-stepped CONCRETE was wrong by one when this was written, which is why the header now says so in as many words.

The removal is not merely allowed, it is required by the compiler: the ablation below shows tsc -p tsconfig.test.json reporting TS2322 at three sites in the ledger (Type '"feedback.zod.ts#ToastSchema"' is not assignable to type 'never') the moment the divergence goes away and the rows stay. The rows drain because the divergence is gone, and the type-level reconciliation is what says so.

Two-direction ablation, with the restore proved

One run, both legs, under a trap ... EXIT INT TERM, mutating by checking the base tree's two declarations back in and restoring with git checkout HEAD --:

ANCHOR feedback.ts   'action?: never;'  before=1 after=0
ANCHOR feedback.ts   'action?: {'       after=1
ANCHOR feedback.zod  tombstone          before=1 after=0
ANCHOR feedback.zod  z.union arm        after=1
MUTATION REACHED DISK - both tombstones removed, both pre-retirement declarations present
ABLATED_VITEST_EXIT=1
ABLATED_TSC_EXIT=2
RESTORE PROVED: both blobs byte-identical to HEAD, `git diff HEAD` empty
RESTORED_VITEST_EXIT=0
RESTORED_TSC_EXIT=0

Ablated, the runtime pins go red on exactly the shapes that used to parse:

AssertionError: still accepts {"type":"button","label":"Undo"}: expected true to be false
AssertionError: still accepts [{"type":"button"}]: expected true to be false
AssertionError: expected 'invalid_union' to be 'invalid_type'
AssertionError: expected 'Invalid input' to be 'Action button'

Ablated, tsc -p tsconfig.test.json reports:

toast-button-keys.test.ts(307,5): error TS2578: Unused '@ts-expect-error' directive.
toast-button-keys.test.ts(331,10): error TS2344: Type 'false' does not satisfy the constraint 'true'.
zod-mirror-parity.test.ts(2370,14): error TS2322: ... not assignable to type 'never'.
zod-mirror-parity.test.ts(2459,14): error TS2322: ... not assignable to type 'never'.
zod-mirror-parity.test.ts(2478,14): error TS2322: ... not assignable to type 'never'.

Only ONE of the two @ts-expect-error directives goes unused under ablation, and that is correct: the old declaration accepted the { label, onClick } object but still refused a node, so the second directive keeps firing. Stated because a report that claimed both would be claiming more than was measured.

The mirror also admitted BARE PRIMITIVES — re-derived, and larger than first read

SchemaNodeSchema is z.union([BaseSchemaCore, z.string(), z.number(), z.boolean(), z.null(), z.undefined()]) (zod/base.zod.ts:84), so the old z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]) accepted far more than two node shapes. Re-derived by re-forming the old spelling around the SHIPPED SchemaNodeSchema rather than a hand-rebuilt one, with a non-vacuity control (the two envelopes must disagree on the node case, else the probe compares a schema with itself — measured old=true new=false):

action = old union tombstone
omitted, or an explicit undefined accept accept
{ "type": "button", "label": "Undo" }, [{ "type": "button" }] accept refuse invalid_type
"Undo", 1, true, null, [], ["a", 1] accept refuse invalid_type
{ "label": "Undo", "onClick": … }, {} refuse invalid_union refuse invalid_type
[[{ "type": "button" }]] — a nested list refuse invalid_union refuse invalid_type

The primitive row is the LARGER half of this narrowing and the easy one to miss; the changeset's table now carries it. RETIRED_MIRROR_SHAPES gained 'Undo', 1 and null, and the list's MIXEDness is now pinned in its own right: vitest 4.1.10 spreads an it.each case only when cases.every(Array.isArray), so the list arm arriving as ONE argument had been resting on an undeclared property of the data. The three added cases show up as three added tests (2795 -> 2799 with the mixedness pin), which is the reading that they were passed whole rather than spread.

The tombstone message was respelled, and the emitted string is asserted unchanged

scripts/check-widening-tells.mjs's T2 arm matches BARE_STRING_ELEMENT — an indented bare quoted string that ENDS a line — so the tombstone's first message fragment, sitting alone on its own line, read as a closed set gaining a member and this NARROWING reported one widening tell. Exactly one, because every continuation carries a leading + , which is itself the proof of the diagnosis. The fragment moved onto the retirementTombstone( call line; no message TEXT changed.

Asserted, not eyeballed: the emitted .describe() string is read off a rebuilt dist before and after and hashed — len 732, sha256 10b0b510c8b4ece4ab594373f870644dcefb9816b9bc92608b0791a060190fcc, identical, with the probe exiting non-zero on any drift; the parse-time issue message still equals .describe() and the code is still invalid_type. Self-scan: the same BARE_STRING_ELEMENT regex over every ADDED line of the whole diff now finds 0 hits, with a synthetic 'destructive', as the control that the regex fires.

retirementTombstone(), and why NOT the neighbour one line down

Triage's model was "照 onDismiss 一模一样的处理,四行之外就是范本". Measured, the neighbour is handlerKeyRefusal('onDismiss', 'retired', 'Dismiss handler') — the handler-key variant, which reports custom and whose remedy sentence is fixed at "author behaviour as a NODE TYPE". action is not a handler key: it is a value key whose nested member was a function. It takes retirementTombstone() (invalid_type, and a guidance string this site writes for itself), which is what triage actually named. Copying line 77 verbatim is the obvious move and it is the wrong one. tombstone.zod.ts is called, not edited.

What replaces it: nothing, and it was never fulfilled

Not "not yet supported" and not a pointer at a future shape. objectui#6250's close moved all seven toast demos off an in-toast action entirely; an in-toast action button is a capability expansion with zero runtime today and would need its own card. The tombstone points at the keys that DO run: raise the toast from the node itself and label its trigger with buttonLabel / buttonVariant.

Repo census: of the 7 authored toast nodes in tracked JSON, 0 carry action (control: the same walk finds all 7), and no source file authors one ON A toast NODE. Stated that narrowly on purpose — app-shell/src/chrome/notificationToast.tsx:76 and chrome/toast-helpers.ts:71 DO write action: { label, onClick }, for sonner's runtime API, a different interface this key never fed. The changeset carries the same correction: a measured zero must not be quoted wider than what was counted.

Not EmptySchema.action

The same word lives 69 lines below in the same file (feedback.zod.ts:152), on a sibling schema, with the deliberately opposite disposition (objectui#7105, PR #8330) and its own comment block explaining that it refuses the { label, onClick } shape this key spelled. It is untouched. Two different interfaces, on purpose.

Verification

Every exit code captured by redirect BEFORE any pipe; every verdict quoted from the gate's own line, never from a bare $?.

run exit reading
vitest run --project unit packages/types 0 146 files, 2799 tests passed (2795 before the primitive cases)
pnpm --filter @object-ui/types type-check 0 all three projects: tsc --noEmit, tsconfig.examples.json, tsconfig.test.json
pnpm --filter @object-ui/components type-check 0 the only downstream consumer of ToastSchema, against a rebuilt dist
pnpm --filter '@object-ui/components^...' build 0 7 tasks — the closure the line above reads
pnpm --filter @object-ui/types lint 0 212 files linted, 0 errors; my 4 files 0/0
node scripts/check-changeset-presence.mjs 0 4 source files, 1 changeset (red at exit 1 before the changeset — positive control)
pnpm changeset:check 0 fixed group + no major
node scripts/check-control-bytes.mjs 0 6746 tracked text files
node scripts/check-governed-queue-guard.mjs --test 0 NOT GOVERNED, 5 paths against 5 surfaces
pnpm check:readme-exports 0 3317 export symbols from 37 of 40 packages
pnpm check:published-dist 0 39 packages, 5931 tarball files
pnpm check:esm-specifiers 0 specifier leg only

vitest alone would be a FALSE GREEN for this ledger: its type-level reconciliation is judged by tsc -p tsconfig.test.json, and --listFiles confirms that project compiles both zod-mirror-parity.test.ts and toast-button-keys.test.ts — so the green is a measurement and not an absence.

All figures re-derived on e8d984461, the final commit; the ratchet family (packages/types tests + all three tsc projects) was re-run on that exact head and is exit 0.

验收备注

  • Filed: objectui#8539 — content/docs/components/feedback/toast.mdx:40-44 still teaches action?: { label, onClick } in its plaintext schema fence. Outside this PR's declared file surface, and measured to be read by NO gate (check-doc-component-types.mjs states in its own header that it judges the type string only). The snippet was already uncopyable before this PR — no JSON document satisfied it — so this is a pre-existing teaching defect whose failure mode this PR changes. Same shape as objectui#7340 and objectui#7239, both of which were filed as their own docs cards rather than ridden into the tombstone PR.
  • noted, not filed: packages/components/src/__tests__/empty-action-declared-7105.test.tsx:149 says in a comment that { label, onClick } "is ToastSchema.action's shape" — present tense, now historical. Cosmetic prose inside another card's pin file (objectui#7105 / PR feat(types,components): declare EmptySchema.action as SchemaNode and enforce it #8330), which this PR is ruled not to touch. Whoever next edits that pin will meet it.
  • noted, not filed: the toast page's fence also omits position, buttonLabel, buttonVariant and the onDismiss tombstone. A hand-maintained subset; recorded on objectui#8539 as an observation and deliberately not folded into its ask. Successor: whoever takes objectui#8539.
  • Draft, and it stays draft: SKILL.md:643 puts *.zod.ts on the contract path limb, so the pre-enqueue in-seat contract review is the PM's to run. This seat does not enqueue, does not flip to ready, and hangs no label the dispatch did not name.
  • Bundle Analysis is red here and is ⛔ NOT this PR's: main itself has been red on that check since f76f4362, four consecutive merges, with the framework chunk over its per-chunk ceiling. Tracked at objectui#8542. Nothing was trimmed for bytes and PER_CHUNK_GZIP_CEILINGS is untouched.
  • Clause-②: no — the retirement NARROWS both faces. Re-checked against the landing: the mirror's accept set loses the node union and gains nothing, and the declaration goes from an object type to never. Nothing widens.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE


Generated by Claude Code

…ectui#8338)

`action` had NO satisfiable JSON inhabitant on the TypeScript face — `label`
and `onClick` were both required and `onClick` is a function — while the zod
mirror admitted `SchemaNode | SchemaNode[]`. Two published faces with disjoint
accept sets, one of them empty: an author who wrote the key got a green
`safeParse` and a `tsc` refusal, and no spelling satisfied both. The `toast`
renderer read neither.

ADR-0049 enforce-or-remove, retire route: `action?: never` on the declaration
and `retirementTombstone()` on the mirror. Not `handlerKeyRefusal()` — `action`
is a value key whose nested member was a function, which is why objectui#6124's
top-level sweep walked past it and retired only `onDismiss`, four lines down.

There is no replacement spelling and the capability was never fulfilled:
objectui#6250 moved the toast demos off an in-toast action entirely.

The parity ledgers drain with it: `KnownDrift` 42/64 -> 41/63 and
`WiderThanDeclared` 23/36/47 (6/30/0/11) -> 22/35/45 (6/29/0/10), every figure
re-derived by the file's own AST and mirror instruments.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
…8338)

Graded minor with the breaking-for-authored-metadata wording PR #7774
established: the mirror's accept set narrows (a node, and a list of nodes, no
longer parse) and the TypeScript face's `{ label, onClick }` literal stops
compiling. Both before/after columns are measured by ablating the tombstone
back to the base tree's declarations and re-running the pins.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3475.0 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-CI564s7H.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ✅ pass
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 498.87KB 114.10KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.12KB 3.28KB
data-objectstack (index.js) 191.36KB 53.16KB
fields (index.js) 243.24KB 61.42KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.53KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 248.46KB 63.90KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.30KB 56.63KB
plugin-kanban (index.js) 55.40KB 15.71KB
plugin-list (index.js) 112.74KB 27.70KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.54KB 20.84KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

os-sales commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

⚠️ Bundle Analysis is red here — and it is red on main too, so it is ⛔ NOT this PR's failure

domain:spec @ objectui execution seat. Reading pinned to this PR's current head 63c9bd239 (matches head.sha), and to main's own runs.

What this PR measures

✅ aggregate closure   3475.0 KB / 3512.7 KB   (headroom 37.7 KB)
✅ vendor-objectstack  1206.2 KB / 1224.6 KB
✅ i18n-locales         441.5 KB /  444.3 KB
✅ ui-components        384.1 KB /  389.6 KB
❌ framework             70.6 KB /   69.3 KB   (OVER by 1.2 KB)
✅ Ceiling sensitivity · ✅ Ceiling freshness

Only the per-chunk half objects, and only on framework (= packages/(core|react|types)).

⭐ The base branch is red on the same check — measured, ⛔ not inferred

Bundle Analysis runs on every main push. Its last six results on main:

run main head landed by conclusion
10702 639ca9dc #8495 ✅ success
10704 f08d1a86 #8485 ✅ success
10706 40a7c538 #8503 ✅ success
10712 512c84b1 #8519 cancelled
10713 f76f4362 #8512 failure
10718 c3002671 #8528 ❌ failure
10719 e76634cc #8529 ❌ failure
10721 90a9aab3 #8533 ❌ failure

main has been red on this check since f76f4362 (2026-09-08T05:44Z) — four consecutive merges. In run 10721 the ONLY failing step is "Check console performance budget" (step 11); every other step in that job concluded success, so the red is the budget itself and ⛔ not an infrastructure failure.

Where the bytes came from, from the tree's own record. #8519's commit message, landed minutes before, states it verbatim:

The zod mirror is deliberately left open and reported for its own card: closing it ships runtime bytes into the console framework chunk, measured at 70,999 gzip bytes against a 71,000 ceiling.

main was at one byte of headroom. f76f4362 (#8512) then landed a set of per-operator refusal message strings into packages/core — which is inside the framework chunk — and took it over. ⚠️ Stated as the reading the timestamps and the chunk definition support; ⛔ this seat did not build f76f4362 to attribute the bytes exactly, and does not claim to have.

What that means for this PR, and what is ⛔ NOT being done

No re-run. A size verdict is a measurement, not a flake, and the base being red is not something a re-run changes.

PER_CHUNK_GZIP_CEILINGS and PER_CHUNK_BASELINE are untouched. Maintainer floor. The gate says so itself in its own failure text — "do not widen it just to get a green check" — and that decision is with the maintainer.

The deliverable was not trimmed to chase bytes. This PR ships one runtime string, the tombstone's guidance, and its content is asserted by the pins (RETIRED (objectui#8338, NO replacement spelling, buttonLabel) and quoted by the changeset. ⚠️ And it would not help: this PR would have to REMOVE ~1.2 KB from framework to go green, which is roughly three times everything it adds. No change inside this card's appetite can make this check pass while the base is over.

No fix exists to port yet. Filed as #8541 so the base-branch failure has an owner; this PR stays parked behind it, exactly as PR #8501 already is.

⚠️ This is now a lane-wide blocker, not one PR's problem

Two PRs are held by it — this one and #8501 (card #8344) — and every future PR touching packages/core, packages/react or packages/types inherits it until the base is green. The domain:spec queue is almost entirely packages/types.

⛔ This PR is not enqueued regardless: SKILL.md:643 puts *.zod.ts on the contract path limb, so the pre-enqueue in-seat contract review at the contract-review tier is owed first and is running. It stays draft.


Generated by Claude Code

os-sales commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

⚠️ Correction to the comment above: the base-branch blocker was filed as #8542, ⛔ not #8541. #8541 is an unrelated card — ⛔ do not follow that reference. Everything else in that comment stands.


Generated by Claude Code

…s firing, and pin the primitive arms it hid (objectui#8338)

Three changes, no behaviour delta on the first, a strictly larger pin on the
rest.

1. The tombstone's first message fragment moves onto the `retirementTombstone(`
   call line. An indented bare quoted string that ENDS a line is regex-identical
   to a closed-set member for `check-widening-tells.mjs`'s `BARE_STRING_ELEMENT`,
   so a NARROWING was reported as one widening tell (exactly one, because every
   continuation carries a leading `+ ` — which is the proof of the diagnosis).
   The emitted string is asserted byte-identical: sha256
   10b0b510c8b4ece4ab594373f870644dcefb9816b9bc92608b0791a060190fcc, len 732,
   read off a rebuilt dist before and after, and the parse-time issue message
   still equals `.describe()`.

2. `RETIRED_MIRROR_SHAPES` gains the primitive arms. Re-derived by re-forming
   `z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)])` around the SHIPPED
   `SchemaNodeSchema` (which is `z.union([BaseSchemaCore, z.string(), z.number(),
   z.boolean(), z.null(), z.undefined()])`): the old mirror ALSO accepted
   `'Undo'`, `1`, `true`, `null`, `[]` and `['a', 1]`. That is the larger half of
   this narrowing and it was unpinned.

3. The shape list's MIXEDness is now pinned. vitest spreads an `it.each` case
   only when `cases.every(Array.isArray)`, so the list arm arriving as one
   argument depended on an undeclared property of the data.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
…ured (objectui#8338)

The note claimed no `.tsx` / `.mdx` / `.ts` source authors an `action` object.
Literally false as written: `app-shell/src/chrome/notificationToast.tsx:76` and
`chrome/toast-helpers.ts:71` both write `action: { label, onClick }` — for
SONNER's runtime API (`import { toast } from 'sonner'`), a different interface
that never fed this key. The conclusion is unchanged (0 of 7 authored `toast`
nodes carry `action`); only the sentence was wider than the measurement, and a
measured zero must not be carried forward wider than what was counted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3475.0 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-CI564s7H.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ✅ pass
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 498.87KB 114.10KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.12KB 3.28KB
data-objectstack (index.js) 191.36KB 53.16KB
fields (index.js) 243.24KB 61.42KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.53KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 248.46KB 63.90KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.30KB 56.63KB
plugin-kanban (index.js) 55.40KB 15.71KB
plugin-list (index.js) 112.74KB 27.70KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.54KB 20.84KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

os-sales commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

⚠️ My own correction above was itself wrong, and this retracts it. I wrote "#8541 is an unrelated card — ⛔ do not follow that reference." That is false.

#8541 is the same finding, filed by the domain:devx seat at 08:22:50Z — 24 minutes before mine, which is why my first comment's reference happened to be right and my correction of it was not. Neither seat saw the other. The two are complementary rather than redundant:

I have posted #8542's readings onto #8541 so the measurement lives on the earlier card. ⛔ I am not closing either — two seats' cards, and the merge is triage's call.

Follow #8541 first. Landing check ② on this PR is now EXIT 0 (re-run on head e8d984461); the only thing left is the base branch.


Generated by Claude Code

@os-sales
os-sales enabled auto-merge September 8, 2026 11:31
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3475.4 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-BBwSgy-I.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ✅ pass
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 498.93KB 114.12KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.12KB 3.28KB
data-objectstack (index.js) 192.25KB 53.44KB
fields (index.js) 243.24KB 61.42KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.53KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 248.46KB 63.90KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.30KB 56.63KB
plugin-kanban (index.js) 55.40KB 15.71KB
plugin-list (index.js) 112.74KB 27.70KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.54KB 20.84KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-sales
os-sales added this pull request to the merge queue Sep 8, 2026
Merged via the queue into main with commit 5323168 Sep 8, 2026
33 of 34 checks passed
@os-sales
os-sales deleted the claude/issue-8338-retire-toast-action branch September 8, 2026 12:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants